/*
 * @Author: cooper
 * @Date: 2025-03-30 21:35:19
 * @Wechat: cmd_develop
 * @Description: 机械臂驱动
 */
#include "./bsp_json.h"
#include "string.h" // 用于 memcpy
json_buffer json_Buffer;

QueueHandle_t json_work_queue; // JSON工作消息队列句柄

// MKS接收数据处理任务句柄
TaskHandle_t json_uart_receive_task_handler;
TaskHandle_t json_work_task_handler;

void json_server_data_function(void);
/*************************************** 4号RS485——json DMA配置 ***************************************/
/**
 * @brief  json串口DMA接收
 * @param  none
 * @retval none
 */

/// @brief json串口DMA接受
/// @param
void JSON_USART_DMA_RX(void)
{
    dma_init_type dma_init_struct;
    /* 使能时钟 */
    crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
    /* 使能dma复用功能 */
    dmamux_enable(DMA1, TRUE);
    /* 复位指定的 DMA 通道 */
    dma_reset(DMA1_CHANNEL4);
    /* 默认填充配置 */
    dma_default_para_init(&dma_init_struct);
    /* DMA 传输数据量+传输方向 */
    dma_init_struct.buffer_size = json_DATA_SIZE;
    dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
    /* 外设地址+数据宽度+地址增加模式 */
    dma_init_struct.peripheral_base_addr = (uint32_t)&USART3->dt;
    dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
    dma_init_struct.peripheral_inc_enable = FALSE;
    /* 存储器地址+数据宽度+地址增加模式 */
    dma_init_struct.memory_base_addr = (uint32_t)(&(RX_JSON(0)));
    dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
    dma_init_struct.memory_inc_enable = TRUE;
    /* 优先级+循环模式 */
    dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH;
    dma_init_struct.loop_mode_enable = FALSE;
    /* 初始化指定的 DMA 通道 */
    dma_init(DMA1_CHANNEL4, &dma_init_struct);
    /* 初始化dma复用功能 */
    dmamux_init(DMA1MUX_CHANNEL4, DMAMUX_DMAREQ_ID_USART3_RX);
    /* 使能指定通道 */
    dma_channel_enable(DMA1_CHANNEL4, TRUE);
    /* 数据接收区数据清理 */
    RX_JSON_BUFCLEAR();
}

/**
 * @brief  json串口DMA发送
 * @param  none
 * @retval none
 */
void JSON_USART_DMA_TX(u16 size)
{
    dma_init_type dma_init_struct;
    /* 使能时钟 */
    crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
    /* 使能dma复用功能 */
    dmamux_enable(DMA1, TRUE);
    /* 复位指定的 DMA 通道 */
    dma_reset(DMA1_CHANNEL4);
    /* 默认填充配置 */
    dma_default_para_init(&dma_init_struct);
    /* DMA 传输数据量+传输方向 */
    dma_init_struct.buffer_size = size;
    dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
    /* 存储器地址+数据宽度+地址增加模式 */
    dma_init_struct.memory_base_addr = (uint32_t)(&(TX_JSON(0)));
    dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
    dma_init_struct.memory_inc_enable = TRUE;
    /*  */
    dma_init_struct.peripheral_base_addr = (uint32_t)&USART3->dt;
    dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
    dma_init_struct.peripheral_inc_enable = FALSE;
    /* 优先级+循环模式 */
    dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH;
    dma_init_struct.loop_mode_enable = FALSE;
    /* 使能DMA发送完成中断 */
    dma_interrupt_enable(DMA1_CHANNEL4, DMA_FDT_INT, TRUE);
    nvic_irq_enable(DMA1_Channel4_IRQn, 1, 0);
    /* 初始化指定的 DMA 通道 */
    dma_init(DMA1_CHANNEL4, &dma_init_struct);
    /* 初始化dma复用功能 */
    dmamux_init(DMA1MUX_CHANNEL4, DMAMUX_DMAREQ_ID_USART3_TX);
    /* 使能指定通道 */
    dma_channel_enable(DMA1_CHANNEL4, TRUE);
}

/**
 * @brief  4号RS485——json初始化
 * @param  none
 * @retval none
 */
void JSON_USART_INIT(void)
{
    gpio_init_type gpio_init_struct;
    /* 使能时钟 */
    crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);
    crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
    /* GPIO配置 */
    gpio_default_para_init(&gpio_init_struct);
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
    gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9;
    gpio_init(GPIOD, &gpio_init_struct);
    /* 复用 */
    gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE8, GPIO_MUX_7);
    gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE9, GPIO_MUX_7);
    /* 串口参数 */
    usart_reset(USART3);
    usart_init(USART3, 38400, USART_DATA_8BITS, USART_STOP_1_BIT);
    usart_transmitter_enable(USART3, TRUE);
    usart_receiver_enable(USART3, TRUE);
    /* 中断配置 */
    nvic_irq_enable(USART3_IRQn, 1, 0);
    usart_interrupt_enable(USART3, USART_IDLE_INT, TRUE);
    /* 使用DMA */
    usart_dma_receiver_enable(USART3, TRUE);
    usart_dma_transmitter_enable(USART3, TRUE);
    /* 使能 */
    usart_enable(USART3, TRUE);
    /* DMA接收	*/
    JSON_USART_DMA_RX();
}

/**
 * @brief  DC电机串口4中断处理函数
 * @param  none
 * @retval none
 */
void USART3_IRQHandler(void)
{
    u8 code[json_work_queue_array_num];
    code[0] = SERVER_RX_CODE; // 服务端转过来的数据

    uint32_t ulReturn;
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    /* 进入临界段，临界段可以嵌套 */
    ulReturn = taskENTER_CRITICAL_FROM_ISR();
    if (usart_flag_get(USART3, USART_IDLEF_FLAG) != RESET)
    {
        dma_channel_enable(DMA1_CHANNEL4, FALSE);
        dma_flag_clear(DMA1_FDT4_FLAG);
        // 获取接收总数
        RX_JSON_TOTAL = json_DATA_SIZE - dma_data_number_get(DMA1_CHANNEL4);
        // 发送消息队列
        xQueueSendFromISR(json_work_queue, &code, &xHigherPriorityTaskWoken);
        // 切换任务
        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
        usart_flag_clear(USART3, USART_IDLEF_FLAG);
    }
    /* 退出临界段 */
    taskEXIT_CRITICAL_FROM_ISR(ulReturn);
}
/**
 * @brief  DC电机串口DMA1通道2中断处理函数
 * @param  none
 * @retval none
 */
void DMA1_Channel4_IRQHandler(void)
{
    uint32_t ulReturn;
    /* 进入临界段，临界段可以嵌套 */
    ulReturn = taskENTER_CRITICAL_FROM_ISR();
    if (dma_interrupt_flag_get(DMA1_FDT4_FLAG))
    {
        /*清除发送 */
        TX_JSON_BUFCLEAR();
        // DMA接收
        JSON_USART_DMA_RX(); // 准备接收
        dma_flag_clear(DMA1_FDT2_FLAG);
    }
    /* 退出临界段 */
    taskEXIT_CRITICAL_FROM_ISR(ulReturn);
}

// 任务函数，等待信号量并处理接收到的数据
void json_work_task_function(void *parameter)
{
    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(300));
    }
}

void JSON_TASK(void)
{
    // 创建长轴工作任务
    xTaskCreate((TaskFunction_t)json_work_task_function,
                (const char *)"JSON_WORK_TASK",
                (uint16_t)4096,
                (void *)NULL,
                (UBaseType_t)3,
                (TaskHandle_t *)&json_work_task_handler);
}
